package com.auntvt.timo.jpax.core.quick.interfaces;

import java.io.Serializable;
import java.util.function.Consumer;

/**
 * 原子查询条件接口（AND, OR ...）
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public interface AtomCriteria<Children> extends Serializable {

    /**
     * 并且
     * <p>sql：and (?, ?, ...)</p>
     * <p>用法：and(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    Children and(boolean condition, Consumer<Children> consumer);

    /**
     * 并且
     * <p>sql：and (?, ?, ...)</p>
     * <p>用法：and(i -> i.xx().xx())</p>
     *
     * @param consumer 可使用箭头函数表达式
     * @return this
     */
    default Children and(Consumer<Children> consumer) {
        return and(true, consumer);
    }

    /**
     * 与或
     * <p>sql：or (?, ?, ...)</p>
     * <p>用法：or(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    Children or(boolean condition, Consumer<Children> consumer);

    /**
     * 与或
     * <p>sql：or (?, ?, ...)</p>
     * <p>用法：or(i -> i.xx().xx())</p>
     *
     * @param consumer 可使用箭头函数表达式
     * @return this
     */
    default Children or(Consumer<Children> consumer) {
        return or(true, consumer);
    }

    /**
     * 非，注意只有第一层链表调用有效
     * <p>sql：not xxx</p>
     * <p>用法：not(i -> i.xx())</p>
     *
     * @param condition 条件表达式
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    Children not(boolean condition, Consumer<Children> consumer);

    /**
     * 非，注意只有第一层链表调用有效
     * <p>sql：not xxx</p>
     * <p>用法：not(i -> i.xx())</p>
     *
     * @param consumer 可使用箭头函数表达式
     * @return this
     */
    default Children not(Consumer<Children> consumer) {
        return not(true, consumer);
    }
}
